package com.yindong.camera.slice.init;

import com.alibaba.fastjson.JSON;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.media.camera.device.Camera;
import ohos.media.camera.device.FrameConfig;
import ohos.media.camera.device.FrameResult;
import ohos.media.camera.device.FrameStateCallback;

/**
 * 帧处理回调
 *
 * @author      殷冬
 * @date        2021-01-31
 * @version     1.0.0
 */
public class FrameCallBack extends FrameStateCallback {

    private static final HiLogLabel LOG = new HiLogLabel(HiLog.LOG_APP, 00201, FrameCallBack.class.getName());

    /**
     * 开始帧捕获时，触发回调
     *
     * @param camera            摄像机对象
     * @param frameConfig       帧配置信息
     * @param frameNumber       帧编号
     * @param timestamp         帧捕获时间戳
     */
    @Override
    public void onFrameStarted(Camera camera, FrameConfig frameConfig, long frameNumber, long timestamp){
        HiLog.info(LOG, "---------------------开始帧捕获： camera: %{public}s;", JSON.toJSONString(camera));
        HiLog.info(LOG, "---------------------开始帧捕获： frameConfig: %{public}s;", JSON.toJSONString(frameConfig));
        HiLog.info(LOG, "---------------------开始帧捕获： frameNumber: %{public}s;  timestamp: %{public}s;", frameNumber, timestamp);
    }

    /**
     * 当帧捕获完成并且所有结果都可用时调用
     *
     * @param camera            摄像机对象
     * @param frameConfig       帧配置信息
     * @param frameResult       帧捕获结果
     */
    @Override
    public void onFrameFinished(Camera camera, FrameConfig frameConfig, FrameResult frameResult){
        HiLog.info(LOG, "---------------------当帧捕获完成并且所有结果都可用时调用： camera: %{public}s;", JSON.toJSONString(camera));
        HiLog.info(LOG, "---------------------当帧捕获完成并且所有结果都可用时调用： frameConfig: %{public}s;", JSON.toJSONString(frameConfig));
        HiLog.info(LOG, "---------------------当帧捕获完成并且所有结果都可用时调用： frameResult: %{public}s;", JSON.toJSONString(frameResult));
    }

    /**
     * 在帧捕获期间有部分结果时调用
     *
     * @param camera            摄像机对象
     * @param frameConfig       帧配置信息
     * @param frameResult       帧捕获结果
     */
    @Override
    public void onFrameProgressed(Camera camera, FrameConfig frameConfig, FrameResult frameResult){
        HiLog.info(LOG, "---------------------在帧捕获期间有部分结果时调用： camera: %{public}s;", JSON.toJSONString(camera));
        HiLog.info(LOG, "---------------------在帧捕获期间有部分结果时调用： frameConfig: %{public}s;", JSON.toJSONString(frameConfig));
    }

    /**
     * 在帧捕获过程中发生错误时调用
     *
     * @param camera            摄像机对象
     * @param frameConfig       帧配置信息
     * @param errorCode         错误码
     * @param frameResult       捕获结果
     */
    @Override
    public void onFrameError(Camera camera, FrameConfig frameConfig, int errorCode, FrameResult frameResult){
        HiLog.info(LOG, "---------------------在帧捕获过程中发生错误时调用： camera: %{public}s;", JSON.toJSONString(camera));
        HiLog.info(LOG, "---------------------在帧捕获过程中发生错误时调用： frameConfig: %{public}s;", JSON.toJSONString(frameConfig));
        HiLog.info(LOG, "---------------------在帧捕获过程中发生错误时调用： errorCode: %{public}s;", errorCode);
        HiLog.info(LOG, "---------------------在帧捕获过程中发生错误时调用： frameResult: %{public}s;", JSON.toJSONString(frameResult));
    }

    /**
     * 在启动触发器的帧捕获时调用
     *
     * @param camera                摄像机对象
     * @param captureTriggerId      触发器ID
     * @param firstFrameNumber      第一个帧编号
     */
    @Override
    public void onCaptureTriggerStarted(Camera camera, int captureTriggerId, long firstFrameNumber){
        HiLog.info(LOG, "---------------------在启动触发器的帧捕获时调用： camera: %{public}s;", JSON.toJSONString(camera));
        HiLog.info(LOG, "---------------------在启动触发器的帧捕获时调用： captureTriggerId: %{public}s; firstFrameNumber: %{public}s;", captureTriggerId, firstFrameNumber);
    }

    /**
     * 当触发的帧捕获动作完成时调用
     *
     * @param camera                摄像机对象
     * @param captureTriggerId      触发器ID
     * @param lastFrameNumber       最后一帧编号，-1表示没有捕获到任何帧
     */
    @Override
    public void onCaptureTriggerFinished(Camera camera, int captureTriggerId, long lastFrameNumber){
        HiLog.info(LOG, "---------------------当触发的帧捕获动作完成时调用： camera: %{public}s;", JSON.toJSONString(camera));
        HiLog.info(LOG, "---------------------当触发的帧捕获动作完成时调用： captureTriggerId: %{public}s; lastFrameNumber: %{public}s;", captureTriggerId, lastFrameNumber);
    }

    /**
     * 当已触发的帧捕获动作提前停止时调用
     *
     * @param camera                摄像机对象
     * @param captureTriggerId      触发器ID
     */
    @Override
    public void onCaptureTriggerInterrupted(Camera camera, int captureTriggerId){
        HiLog.info(LOG, "---------------------当已触发的帧捕获动作提前停止时调用： camera: %{public}s;", JSON.toJSONString(camera));
        HiLog.info(LOG, "---------------------当已触发的帧捕获动作提前停止时调用： captureTriggerId: %{public}s;", captureTriggerId);

    }

}
